其他
蚂蚁集团于雨:万级规模 K8S 集群 Etcd 高可用建设之路
The following article is from 金融级分布式架构 Author 于雨
- 前言 -
- 面临的挑战 -
etcd 集群的数据库 kube-apiserver etcd 的 API 接口代理、数据缓存层 kubelet 数据的生产者和消费者 kube-controller-manager 数据的消费者和生产者 kube-scheduler 数据的消费者和生产者
etcd 消息路由器 kube-apiserver etcd 生产者消息代理和消息广播【或者成为次级消息路由器、消费者代理】 kubelet 消息的生产者和消费者 kube-controller-manager 消息的消费者和生产者 kube-scheduler 消息的消费者和生产者
etcd KV 数据量级在 100 万以上; etcd event 数据量在 10 万以上; etcd 读流量压力峰值在 30 万 pqm 以上,其中读 event 在 10k qpm 以上; etcd 写流量压力峰值在 20 万 pqm 以上,其中写 event 在 15k qpm 以上; etcd CPU 经常性飙升到 900% 以上; etcd 内存 RSS 在 60 GiB 以上; etcd 磁盘使用量可达 100 GiB 以上; etcd 自身的 goroutine 数量 9k 以上; etcd 使用的用户态线程达 1.6k 以上; etcd gc 单次耗时常态下可达 15ms。
etcd 出现大量的读写延迟,延迟甚至可达分钟级; kube-apiserver 查询 pods / nodes / configmap / crd 延时很高,导致 etcd oom; etcd list-all pods 时长可达 30 分钟以上; 2020 年 etcd 集群曾因 list-all 压力被打垮导致的事故就达好几起; 控制器无法及时感知数据变化,如出现 watch 数据延迟可达 30s 以上。
- 高可用策略 -
提升自身稳定性与性能; 精细管理上游流量; 保证服务下游服务 SLO。
- 文件系统升级 -
- etcd 调参 -
write batch compaction
batch write number 批量写 KV 数目,默认值是 10k; batch write interval 批量写事件间隔,默认值是 100 ms。
compaction interval 压缩任务周期时长; compaction sleep interval 单次压缩批次间隔时长,默认 10 ms; compaction batch limit 单次压缩批次 KV 数目,默认 1000。
etcd 另外提供了 comapct 命令和 API 接口,k8s kube-apiserver 基于这个 API 接口也对外提供了 compact 周期参数; etcd 自身会周期性地执行 compaction; etcd 对外提供了自身周期性 compaction 参数调整接口,这个参数的取值范围是 (0, 1 hour]; 其意义是:etcd compaction 即只能打开不能关闭,如果设置的周期时长大于 1 hour,则 etcd 会截断为 1 hour。
在 etcd 层面把 compaction 周期尽可能地拉长,如取值 1 hour,形同在 etcd 自身层面关闭 compaction,把 compaction interval 的精细调整权交给 k8s kube-apiserver; 在 k8s kube-apiserver 层面,根据线上集群规模取值不同的 compaction interval。
在 etcd 层面设定 compaction 周期是 1 hour; 在 kube-apiserver 层面设定 comapction 周期是 30 minutes; 在 etcd 运维平台上启动一个周期性任务:当前时间段在业务波谷期,则启动一个 10 minutes 周期的 compaction 任务。
- 运维平台 -
通过压测或者在线获取 etcd 运行 profile,分析 etcd 流程的瓶颈,然后优化代码流程提升性能; 通过其他手段降低单节点 etcd 数据量。
longest N KV --- 长度最长的 N 个 KV top N KV --- 段时间内访问次数最多的 N 个 KV top N namespace --- KV 数目最多的 N 个 namespace verb + resoure --- 外部访问的动作和资源统计 连接数 --- 每个 etcd 节点的长连接数目 client 来源统计 --- 每个 etcd 节点的外部请求来源统计 冗余数据分析 --- etcd 集群中近期无外部访问的 KV 分布
客户限流 负载均衡 集群拆分 冗余数据删除 业务流量精细分析
pod/cm node/svc event, lease
kube-apiserver 在启动时可以通过随机方式保证其与 etcd 集群中某个节点建立连接,但 etcd 发生启停后,kube-apiserver 与 etcd 之间的连接数并无规律,导致每个 etcd 节点承担的客户端压力不均衡; kube-apiserver 与 etcd 连接数均衡时,其所有读写请求有 2/3 概率是经过 follower 转发到 leader,保证整体 etcd 集群负载的均衡,如果连接不均衡则集群性能无法评估。
- 未来之路 -
etcd 最新 feature 地及时跟进,及时把社区技术进步带来的开源价值转换为蚂蚁 k8s 平台上的客户价值 及时跟进阿里集团在 etcd compact 算法优化、etcd 单节点多 multiboltdb 的架构优化以及 kube-apiserver 的服务端数据压缩等 etcd 优化工作【见参考文档 1】,对兄弟团队的工作进行借鉴和反馈,协同作战共同提升 跟进蚂蚁自身 k8s 平台上 etcd 的性能瓶颈,提出我们自己的解决方案,在提升我们平台的技术价值的同时反哺开源
- 参考文档 -
- 作者简介 -
推荐阅读
2021-08-03
2021-05-31
2021-03-31
2021-03-25
2021-03-29
2021-03-18
2021-08-16
2021-08-16
2021-08-09
2021-08-09
2021-08-24
2021-08-20
2021-09-14
2021-09-12
2021-09-09
2021-09-08
2021-09-15
2021-09-14
2021-09-12
2021-09-09
2021-09-08